package com.ruoyi.merchant.mapper;

import com.ruoyi.merchant.domain.ChatRecord;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 聊天记录Mapper接口
 */
@Mapper
public interface ChatRecordMapper {
    /**
     * 查询聊天记录
     */
    ChatRecord selectChatRecordById(Long chatId);

    /**
     * 查询聊天记录列表
     */
    List<ChatRecord> selectChatRecordList(ChatRecord chatRecord);

    /**
     * 新增聊天记录
     */
    int insertChatRecord(ChatRecord chatRecord);

    /**
     * 修改聊天记录
     */
    int updateChatRecord(ChatRecord chatRecord);

    /**
     * 删除聊天记录
     */

    int softDeleteMessagesBySessionId(@Param("sessionId") Long sessionId,
                                      @Param("merchantId") Long merchantId);

    /**
     * 批量删除聊天记录
     */
    int deleteChatRecordByIds(Long[] chatIds);

    /**
     * 获取会话聊天记录
     */
    List<ChatRecord> selectChatHistoryBySessionId(@Param("sessionId") Long sessionId,
                                                  @Param("merchantId") Long merchantId);

    /**
     * 统计商家的未读消息数量（按聊天类型分组）
     */
    @MapKey("chat_type")
    Map<Integer, Map<String, Object>> selectUnreadCountByMerchantId(@Param("merchantId") Long merchantId);

    /**
     * 获取商家的服务评分统计（基于chat_records表的service_rating字段）
     */
    Map<String, Object> selectServiceScoreByMerchantId(@Param("merchantId") Long merchantId,
                                                       @Param("days") Integer days);

    /**
     * 获取商家的历史评分用于趋势计算
     */
    Map<String, Object> selectPreviousServiceScore(@Param("merchantId") Long merchantId,
                                                   @Param("startDays") Integer startDays,
                                                   @Param("endDays") Integer endDays);

    /**
     * 获取商家会话列表
     */
    List<Map<String, Object>> selectSessionListByMerchantId(@Param("merchantId") Long merchantId,
                                                            @Param("msgType") String msgType);

    /**
     * 标记消息为已读
     */
    int markMessagesAsRead(@Param("sessionId") Long sessionId,
                           @Param("messageIds") List<Long> messageIds,
                           @Param("merchantId") Long merchantId);

    /**
     * 获取会话的最后一条消息
     * @param sessionId 会话ID
     * @return 最后一条消息
     */
    ChatRecord selectLastMessageBySessionId(@Param("sessionId") Long sessionId);

    /**
     * 获取会话未读消息数
     */
    int selectUnreadCountBySessionId(@Param("sessionId") Long sessionId,
                                     @Param("merchantId") Long merchantId);

    /**
     * 根据会话ID查询对应的customerId
     */

    Long selectCustomerIdBySession(@Param("sessionId") Long sessionId);

    /**
     * 根据用户ID查询用户信息（包括头像）
     */
    Map<String, Object> selectUserInfoById(@Param("userId") Long userId);

    /**
     * 根据商家ID查询商家信息（包括头像）
     */
    Map<String, Object> selectMerchantInfoById(@Param("merchantId") Long merchantId);

    /**
     * 根据用户ID查询商家信息
     */
    Map<String, Object> selectMerchantInfoByUserId(@Param("userId") Long userId);

    /**
     * 根据 customer_id 查询用户信息
     */
    Map<String, Object> selectUserInfoByCustomerId(Long customerId);

    /**
     * 根据 user_id 查询用户信息
     */
    Map<String, Object> selectUserInfoByUserId(Long userId);

    /**
     * 检查会话访问权限
     */
    boolean checkSessionAccess(@Param("sessionId") Long sessionId, @Param("merchantId") Long merchantId);
}